package com.example.novelstory.service.lxy;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.novelstory.dao.lxy.UserDao;
import com.example.novelstory.entity.User;
import com.example.novelstory.utill.Constants;
import com.example.novelstory.utill.Result;
import com.example.novelstory.utill.TencentSmsUtil;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

/**
 * Service实现类    需要继承mybatisplus提供通用的Service基类
 * ServiceImpl<UserDao,User>
 *     2个泛型  1，UserDao,User
 *             2.UserDao 对应的实体
 * @author jieli
 */

@Service
public class UserServiceImpl extends ServiceImpl<UserDao,User> {

//    public List<User> findAllUserList() {
//        //使用mybatis-plus公共接口完成列表查询
//        return list();
//    }
@Autowired
TencentSmsUtil tencentSmsUtil;

//发送短信
public SendStatus[] SendSmsService(HttpServletRequest request, String telephone){
    return tencentSmsUtil.sendSmsUtil(request,telephone);

}

//短信注册
public Result signupService(HttpServletRequest requestSign,String telephoneSign,String verifyCodeSign) {
    User one;
    User user = new User();
    JSONObject json = (JSONObject) requestSign.getSession().getAttribute("verifyCode");
    if (!json.getString("verifyCode").equals(verifyCodeSign)) {
        return Result.errorVerifyCode();
    }
//    创建短信的时间
    if ((System.currentTimeMillis() - json.getLong("createTime")) > 1000 * 60 * 5) {
//        时间过期
        return Result.errorTimeout();
    }
//    获取session中手机号对比
    if (!json.getString("telephone").equals(telephoneSign)) {
        return Result.error(Constants.CODE_600, "手机号与发送验证码的号码不同");
    }
        /***查询User的实体类的对应表*/
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        /**查询条件*/
        queryWrapper.eq("telephone", telephoneSign);

        /**系统异常捕获*/

            /**查询信息*/
        one = getOne(queryWrapper);
        /**业务异常捕获*/
        if (one == null) {
//            获取前端传入的手机号存放在临时的user对象中
            user.setTelephone(telephoneSign);
//            保存对象
            save(user);
        } else {

            Result.error(Constants.CODE_600, "用户已存在");
        }
        return Result.successMsg(Constants.CODE_200,"您已注册成功",one);
}
//短信登录
public Result loginsmsService(HttpServletRequest requestLogin,String telephoneLogin,String verifyCodeLogin) {
    JSONObject jsonLogin = (JSONObject)requestLogin.getSession().getAttribute("verifyCode");
    if(!jsonLogin.getString("verifyCode").equals(verifyCodeLogin)){
//        验证码错误
        return Result.errorVerifyCode();
    }
    if((System.currentTimeMillis() - jsonLogin.getLong("createTime")) > 1000 * 60 * 5){
//        验证码过期
        return Result.errorTimeout();
    }
    if (!jsonLogin.getString("telephone").equals(telephoneLogin)){
        return Result.error(Constants.CODE_600,"手机号与发送验证码的号码不同");
    }
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//    传入手机号，手机号登陆
    queryWrapper.eq("telephone",telephoneLogin);
    User one;
    /**系统异常捕获 数据库操作*/
    try {
        one = getOne(queryWrapper);
    } catch (Exception e) {
        /**可加入一个打日志操作*/
       return Result.error(Constants.CODE_600,"数据库执行异常");
    }
    /**业务异常捕获*/
    if(one != null){
        return Result.successMsg(Constants.CODE_200,"您已登录成功",one);
    } else {
        return Result.error(Constants.CODE_600,"您还未注册用户");
    }
}
//密码登陆
public Result loginPwdService(User user) {
    String telephone = user.getTelephone();
    String password = user.getPassword();
//        判断用户名或者密码是否为空
    if (StrUtil.isBlank(telephone) || StrUtil.isBlank(password)){
        /**用户和密码为空返回false*/
        return Result.error(Constants.CODE_600,"密码或电话号为空");
    } else {
        /**查询User的实体类的对应表*/
//            实现查询操作的
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        /**查询条件*/
        queryWrapper.eq("telephone",user.getTelephone());
        queryWrapper.eq("password",user.getPassword());
        User one;//类部对象变量
        /**系统异常捕获 数据库操作*/
        try {
            one = getOne(queryWrapper);
        } catch (Exception e) {
            /**可加入一个打日志操作*/
            return Result.error();
        }
        /**业务异常捕获*/
        if(one != null){
            return Result.successMsg(Constants.CODE_200,"您已登录成功",one);//查出用户，登录成功
        } else {
            return Result.error(Constants.CODE_600,"用户不存在");//查无此信息，不存在用户
        }
    }
}

//    //全查
//    @Override
    public List<User> findAll() {
//        List<User> userList= userDao.findAll();

        return list();
    }
    //添加
//    @Override
    public boolean addUser(User user) {
//        String usernametmp = username;
//        int insertUser= userDao.addUser(usernametmp, email, password, sex, province, city, country);
//        if (insertUser == 1){
//            List<User> userList=userDao.findn(username);
//            return userList;
//        }else {
//            return null;
//        }
        return save(user);
    }
    //删除
//    @Override
    public boolean deleteUser(int id) {
//        int deleteUser=userDao.deleteUser(id);
//        if(deleteUser == 1){
//            List<User> userList= userDao.findAll();
//            return userList;
//        }else {
//        return null;
//        }
        return removeById(id);
    }
//修改
//    @Override
    public boolean updateUser(User user) {
//        String usernametmp = username;
//        int upadateUser= userDao.updateUser(username, password);
//        if (upadateUser == 1){
//            List<User> userList=userDao.findn(username);
//            return userList;
//        }else {
//            return null;
//        }
        QueryWrapper queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername());
        return update(user,queryWrapper);
    }
//模糊查询
//    @Override
    public List<User> findname(User user) {
//        List<User> userList=userDao.findn(username);
        QueryWrapper queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername());
        List<User> userList=list(queryWrapper);
        return userList;
    }
}
